-- 1. 存有 token的key
-- 2. token"上次刷新时间"的key
-- 3. token生成的速率
-- 4. 令牌桶最大容量
-- 5. 获取token的当前时间
-- 6. 请求的token数
local tokens_key = KEYS[1]
local timestamp_key = KEYS[2]
local rate = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])

-- 获取存储满token的时间 & 当前tokenkey的ttl
local fill_time = capacity/rate
local ttl = math.floor(fill_time*2)
-- 获取上一次的token数，如果为空，那么初时为最大容量
local last_tokens = tonumber(redis.call("get", tokens_key))
if last_tokens == nil then
    last_tokens = capacity
end
-- 获取上一次刷新token数的时间
local last_refreshed = tonumber(redis.call("get", timestamp_key))
if last_refreshed == nil then
    last_refreshed = 0
end
-- 计算 [last_refreshed, now]期间生成的token数
local delta = math.max(0, now-last_refreshed)
local filled_tokens = math.min(capacity, last_tokens+(delta*rate))
local allowed = filled_tokens >= requested
local new_tokens = filled_tokens
local allowed_num = 0
-- 获取token的逻辑
if allowed then
    new_tokens = filled_tokens - requested
    allowed_num = 1
end
-- 重新设置 token数 & 上次刷新时间
redis.call("setex", tokens_key, ttl, new_tokens)
redis.call("setex", timestamp_key, ttl, now)
-- 返回执行结果 & 最新token数
return { allowed_num, new_tokens }